home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / RTLWIN16.PAK / COMPOBJ.H < prev    next >
C/C++ Source or Header  |  1997-05-06  |  34KB  |  1,034 lines

  1. /*****************************************************************************\
  2. *                                                                             *
  3. * compobj.h -   Component object model definitions                                                        *
  4. *                                                                             *
  5. *               OLE Version 2.0                                               *
  6. *                                                                             *
  7. \*****************************************************************************/
  8.  
  9. /* $Copyright: 1994$ */
  10.  
  11. #if !defined( _COMPOBJ_H_ )
  12. #define _COMPOBJ_H_
  13. #define __COMPOBJ_H
  14.  
  15. /****** Linkage Definitions *************************************************/
  16.  
  17. /*
  18.  *      These are macros for declaring methods/functions.  They exist so that
  19.  *      control over the use of keywords (CDECL, PASCAL, __export,
  20.  *      extern "C") resides in one place, and because this is the least
  21.  *      intrusive way of writing function declarations that do not have
  22.  *      to be modified in order to port to the Mac.
  23.  *
  24.  *      The macros without the trailing underscore are for functions/methods
  25.  *      which a return value of type HRESULT; this is by far the most common
  26.  *      case in OLE. The macros with a trailing underscore take a return
  27.  *      type as a parameter.
  28.  *
  29.  * WARNING: STDAPI is hard coded into the LPFNGETCLASSOBJECT typedef below.
  30.  */
  31.  
  32. #ifdef __cplusplus
  33.     #define EXTERN_C    extern "C"
  34. #else
  35.     #define EXTERN_C    extern
  36. #endif
  37.  
  38. #ifdef _MAC
  39. #define STDMETHODCALLTYPE
  40. #define STDAPICALLTYPE          pascal
  41.  
  42. #define STDAPI                  EXTERN_C STDAPICALLTYPE HRESULT
  43. #define STDAPI_(type)           EXTERN_C STDAPICALLTYPE type
  44.  
  45. #else   //  !_MAC
  46.  
  47. #ifdef WIN32
  48. #define STDMETHODCALLTYPE       __export __cdecl
  49. #define STDAPICALLTYPE          __export __stdcall
  50.  
  51. #define STDAPI                  EXTERN_C HRESULT STDAPICALLTYPE
  52. #define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
  53.  
  54. #else
  55. #define STDMETHODCALLTYPE       __export FAR CDECL
  56. #define STDAPICALLTYPE          __export FAR PASCAL
  57.  
  58. #define STDAPI                  EXTERN_C HRESULT STDAPICALLTYPE
  59. #define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
  60.  
  61. #endif
  62.  
  63. #endif //!_MAC
  64.  
  65. #define STDMETHODIMP            HRESULT STDMETHODCALLTYPE
  66. #define STDMETHODIMP_(type)     type STDMETHODCALLTYPE
  67.  
  68.  
  69. /****** Interface Declaration ***********************************************/
  70.  
  71. /*
  72.  *      These are macros for declaring interfaces.  They exist so that
  73.  *      a single definition of the interface is simulataneously a proper
  74.  *      declaration of the interface structures (C++ abstract classes)
  75.  *      for both C and C++.
  76.  *
  77.  *      DECLARE_INTERFACE(iface) is used to declare an interface that does
  78.  *      not derive from a base interface.
  79.  *      DECLARE_INTERFACE_(iface, baseiface) is used to declare an interface
  80.  *      that does derive from a base interface.
  81.  *
  82.  *      By default if the source file has a .c extension the C version of
  83.  *      the interface declaratations will be expanded; if it has a .cpp
  84.  *      extension the C++ version will be expanded. if you want to force
  85.  *      the C version expansion even though the source file has a .cpp
  86.  *      extension, then define the macro "CINTERFACE".
  87.  *      eg.     cl -DCINTERFACE file.cpp
  88.  *
  89.  *      Example Interface declaration:
  90.  *
  91.  *          #undef  INTERFACE
  92.  *          #define INTERFACE   IClassFactory
  93.  *
  94.  *          DECLARE_INTERFACE_(IClassFactory, IUnknown)
  95.  *          {
  96.  *              // *** IUnknown methods ***
  97.  *              STDMETHOD(QueryInterface) (THIS_
  98.  *                                        REFIID riid,
  99.  *                                        LPVOID FAR* ppvObj) PURE;
  100.  *              STDMETHOD_(ULONG,AddRef) (THIS) PURE;
  101.  *              STDMETHOD_(ULONG,Release) (THIS) PURE;
  102.  *
  103.  *              // *** IClassFactory methods ***
  104.  *              STDMETHOD(CreateInstance) (THIS_
  105.  *                                        LPUNKNOWN pUnkOuter,
  106.  *                                        REFIID riid,
  107.  *                                        LPVOID FAR* ppvObject) PURE;
  108.  *          };
  109.  *
  110.  *      Example C++ expansion:
  111.  *
  112.  *          struct FAR IClassFactory : public IUnknown
  113.  *          {
  114.  *              virtual HRESULT STDMETHODCALLTYPE QueryInterface(
  115.  *                                                  IID FAR& riid,
  116.  *                                                  LPVOID FAR* ppvObj) = 0;
  117.  *              virtual HRESULT STDMETHODCALLTYPE AddRef(void) = 0;
  118.  *              virtual HRESULT STDMETHODCALLTYPE Release(void) = 0;
  119.  *              virtual HRESULT STDMETHODCALLTYPE CreateInstance(
  120.  *                                              LPUNKNOWN pUnkOuter,
  121.  *                                              IID FAR& riid,
  122.  *                                              LPVOID FAR* ppvObject) = 0;
  123.  *          };
  124.  *
  125.  *          NOTE: Our documentation says '#define interface class' but we use
  126.  *          'struct' instead of 'class' to keep a lot of 'public:' lines
  127.  *          out of the interfaces.  The 'FAR' forces the 'this' pointers to
  128.  *          be far, which is what we need.
  129.  *
  130.  *      Example C expansion:
  131.  *
  132.  *          typedef struct IClassFactory
  133.  *          {
  134.  *              const struct IClassFactoryVtbl FAR* lpVtbl;
  135.  *          } IClassFactory;
  136.  *
  137.  *          typedef struct IClassFactoryVtbl IClassFactoryVtbl;
  138.  *
  139.  *          struct IClassFactoryVtbl
  140.  *          {
  141.  *              HRESULT (STDMETHODCALLTYPE * QueryInterface) (
  142.  *                                                  IClassFactory FAR* This,
  143.  *                                                  IID FAR* riid,
  144.  *                                                  LPVOID FAR* ppvObj) ;
  145.  *              HRESULT (STDMETHODCALLTYPE * AddRef) (IClassFactory FAR* This) ;
  146.  *              HRESULT (STDMETHODCALLTYPE * Release) (IClassFactory FAR* This) ;
  147.  *              HRESULT (STDMETHODCALLTYPE * CreateInstance) (
  148.  *                                                  IClassFactory FAR* This,
  149.  *                                                  LPUNKNOWN pUnkOuter,
  150.  *                                                  IID FAR* riid,
  151.  *                                                  LPVOID FAR* ppvObject);
  152.  *              HRESULT (STDMETHODCALLTYPE * LockServer) (
  153.  *                                                  IClassFactory FAR* This,
  154.  *                                                  BOOL fLock);
  155.  *          };
  156.  */
  157.  
  158.  
  159. #if defined(__cplusplus) && !defined(CINTERFACE)
  160. #ifdef __TURBOC__
  161. #define interface               struct huge
  162. #else
  163. #define interface               struct FAR
  164. #endif
  165. #define STDMETHOD(method)       virtual HRESULT STDMETHODCALLTYPE method
  166. #define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
  167. #define PURE                    = 0
  168. #define THIS_
  169. #define THIS                    void
  170. #define DECLARE_INTERFACE(iface)    interface iface
  171. #define DECLARE_INTERFACE_(iface, baseiface)    interface iface : public baseiface
  172.  
  173. #else
  174. #define interface               struct
  175.  
  176. #ifdef _MAC
  177.  
  178. #define STDMETHOD(method)       long    method##pad;\
  179.                 HRESULT (STDMETHODCALLTYPE * method)
  180. #define STDMETHOD_(type,method) long    method##pad;\
  181.                 type (STDMETHODCALLTYPE * method)
  182.  
  183. #else // _MAC
  184.  
  185. #define STDMETHOD(method)       HRESULT (STDMETHODCALLTYPE * method)
  186. #define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)
  187.  
  188. #endif // !_MAC
  189.  
  190. #define PURE
  191. #define THIS_                   INTERFACE FAR* This,
  192. #define THIS                    INTERFACE FAR* This
  193. #ifdef CONST_VTABLE
  194. #define DECLARE_INTERFACE(iface)    typedef interface iface { \
  195.                     const struct iface##Vtbl FAR* lpVtbl; \
  196.                 } iface; \
  197.                 typedef const struct iface##Vtbl iface##Vtbl; \
  198.                 const struct iface##Vtbl
  199. #else
  200. #define DECLARE_INTERFACE(iface)    typedef interface iface { \
  201.                     struct iface##Vtbl FAR* lpVtbl; \
  202.                 } iface; \
  203.                 typedef struct iface##Vtbl iface##Vtbl; \
  204.                 struct iface##Vtbl
  205. #endif
  206. #define DECLARE_INTERFACE_(iface, baseiface)    DECLARE_INTERFACE(iface)
  207.  
  208. #endif
  209.  
  210.  
  211. /****** Additional basic types **********************************************/
  212.  
  213.  
  214. #ifndef FARSTRUCT
  215. #ifdef __cplusplus
  216. #define FARSTRUCT   FAR
  217. #else
  218. #define FARSTRUCT
  219. #endif  // __cplusplus
  220. #endif  // FARSTRUCT
  221.  
  222.  
  223. #ifndef WINAPI          /* If not included with 3.1 headers... */
  224.  
  225. #ifdef WIN32
  226. #define FAR
  227. #define PASCAL          __stdcall
  228. #define CDECL
  229. #else
  230. #define FAR             _far
  231. #define PASCAL          _pascal
  232. #define CDECL           _cdecl
  233. #endif
  234.  
  235. #define VOID            void
  236. #define WINAPI      FAR PASCAL
  237. #define CALLBACK    FAR PASCAL
  238.  
  239. #ifndef FALSE
  240. #define FALSE 0
  241. #define TRUE 1
  242. #endif
  243.  
  244. typedef int BOOL;
  245. typedef unsigned char BYTE;
  246. typedef unsigned short WORD;
  247. typedef unsigned int UINT;
  248.  
  249. typedef long LONG;
  250. typedef unsigned long DWORD;
  251.  
  252.  
  253. typedef UINT WPARAM;
  254. typedef LONG LPARAM;
  255. typedef LONG LRESULT;
  256.  
  257. typedef unsigned int HANDLE;
  258. #define DECLARE_HANDLE(name)    typedef UINT name
  259.  
  260. DECLARE_HANDLE(HMODULE);
  261. DECLARE_HANDLE(HINSTANCE);
  262. DECLARE_HANDLE(HLOCAL);
  263. DECLARE_HANDLE(HGLOBAL);
  264. DECLARE_HANDLE(HDC);
  265. DECLARE_HANDLE(HRGN);
  266. DECLARE_HANDLE(HWND);
  267. DECLARE_HANDLE(HMENU);
  268. DECLARE_HANDLE(HACCEL);
  269. DECLARE_HANDLE(HTASK);
  270.  
  271. #if !defined(NULL)
  272. #if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
  273. #  define NULL    0
  274. #else
  275. #  define NULL    0L
  276. #endif
  277. #endif
  278.  
  279.  
  280. typedef void FAR *      LPVOID;
  281. typedef WORD FAR *      LPWORD;
  282. typedef DWORD FAR *     LPDWORD;
  283. typedef char FAR*       LPSTR;
  284. typedef const char FAR* LPCSTR;
  285. typedef void FAR*       LPLOGPALETTE;
  286. typedef void FAR*       LPMSG;
  287. //typedef struct tagMSG FAR *LPMSG;
  288.  
  289. typedef HANDLE FAR *LPHANDLE;
  290. typedef struct tagRECT FAR *LPRECT;
  291.  
  292. typedef struct FARSTRUCT tagSIZE
  293. {
  294.     int cx;
  295.     int cy;
  296. } SIZE;
  297. typedef SIZE*       PSIZE;
  298.  
  299.  
  300. #endif  /* WINAPI */
  301.  
  302.  
  303. typedef short SHORT;
  304. typedef unsigned short USHORT;
  305. typedef DWORD ULONG;
  306.  
  307.  
  308. #ifndef HUGEP
  309. #ifdef WIN32
  310. #define HUGEP
  311. #else
  312. #define HUGEP __huge
  313. #endif // WIN32
  314. #endif // HUGEP
  315.  
  316. typedef WORD WCHAR;
  317.  
  318. #ifndef WIN32
  319. typedef struct FARSTRUCT _LARGE_INTEGER {
  320.     DWORD LowPart;
  321.     LONG  HighPart;
  322. } LARGE_INTEGER, *PLARGE_INTEGER;
  323. #endif
  324. #define LISet32(li, v) ((li).HighPart = ((LONG)(v)) < 0 ? -1 : 0, (li).LowPart = (v))
  325.  
  326. #ifndef WIN32
  327. typedef struct FARSTRUCT _ULARGE_INTEGER {
  328.     DWORD LowPart;
  329.     DWORD HighPart;
  330. } ULARGE_INTEGER, *PULARGE_INTEGER;
  331. #endif
  332. #define ULISet32(li, v) ((li).HighPart = 0, (li).LowPart = (v))
  333.  
  334. #ifndef _FILETIME_
  335. #define _FILETIME_
  336. typedef struct FARSTRUCT tagFILETIME
  337. {
  338.     DWORD dwLowDateTime;
  339.     DWORD dwHighDateTime;
  340. } FILETIME;
  341. #endif
  342.  
  343. #ifdef WIN32
  344. #define HTASK DWORD
  345. #endif
  346.  
  347. #include "scode.h"
  348.  
  349.  
  350.  
  351. // *********************** Compobj errors **********************************
  352.  
  353. #define CO_E_NOTINITIALIZED         (CO_E_FIRST + 0x0)
  354. // CoInitialize has not been called and must be
  355.  
  356. #define CO_E_ALREADYINITIALIZED     (CO_E_FIRST + 0x1)
  357. // CoInitialize has already been called and cannot be called again (temporary)
  358.  
  359. #define CO_E_CANTDETERMINECLASS     (CO_E_FIRST + 0x2)
  360. // can't determine clsid (e.g., extension not in reg.dat)
  361.  
  362. #define CO_E_CLASSSTRING            (CO_E_FIRST + 0x3)
  363. // the string form of the clsid is invalid (including ole1 classes)
  364.  
  365. #define CO_E_IIDSTRING              (CO_E_FIRST + 0x4)
  366. // the string form of the iid is invalid
  367.  
  368. #define CO_E_APPNOTFOUND            (CO_E_FIRST + 0x5)
  369. // application not found
  370.  
  371. #define CO_E_APPSINGLEUSE           (CO_E_FIRST + 0x6)
  372. // application cannot be run more than once
  373.  
  374. #define CO_E_ERRORINAPP             (CO_E_FIRST + 0x7)
  375. // some error in the app program file
  376.  
  377. #define CO_E_DLLNOTFOUND            (CO_E_FIRST + 0x8)
  378. // dll not found
  379.  
  380. #define CO_E_ERRORINDLL             (CO_E_FIRST + 0x9)
  381. // some error in the dll file
  382.  
  383. #define CO_E_WRONGOSFORAPP          (CO_E_FIRST + 0xa)
  384. // app written for other version of OS or other OS altogether
  385.  
  386. #define CO_E_OBJNOTREG              (CO_E_FIRST + 0xb)
  387. // object is not registered
  388.  
  389. #define CO_E_OBJISREG               (CO_E_FIRST + 0xc)
  390. // object is already registered
  391.  
  392. #define CO_E_OBJNOTCONNECTED        (CO_E_FIRST + 0xd)
  393. // handler is not connected to server
  394.  
  395. #define CO_E_APPDIDNTREG            (CO_E_FIRST + 0xe)
  396. // app was launched, but didn't registered a class factory
  397.  
  398.  
  399. // ********************* ClassObject errors ********************************
  400.  
  401. #define CLASS_E_NOAGGREGATION       (CLASSFACTORY_E_FIRST + 0x0)
  402. // class does not support aggregation (or class object is remote)
  403.  
  404. #define CLASS_E_CLASSNOTAVAILABLE   (CLASSFACTORY_E_FIRST + 0x1)
  405. // dll doesn't support that class (returned from DllGetClassObject)
  406.  
  407.  
  408. // *********************** Reg.dat errors **********************************
  409.  
  410. #define REGDB_E_READREGDB           (REGDB_E_FIRST + 0x0)
  411. // some error reading the registration database
  412.  
  413. #define REGDB_E_WRITEREGDB          (REGDB_E_FIRST + 0x1)
  414. // some error reading the registration database
  415.  
  416. #define REGDB_E_KEYMISSING          (REGDB_E_FIRST + 0x2)
  417. // some error reading the registration database
  418.  
  419. #define REGDB_E_INVALIDVALUE        (REGDB_E_FIRST + 0x3)
  420. // some error reading the registration database
  421.  
  422. #define REGDB_E_CLASSNOTREG         (REGDB_E_FIRST + 0x4)
  423. // some error reading the registration database
  424.  
  425. #define REGDB_E_IIDNOTREG           (REGDB_E_FIRST + 0x5)
  426. // some error reading the registration database
  427.  
  428.  
  429. // *************************** RPC errors **********************************
  430.  
  431. #define RPC_E_FIRST    MAKE_SCODE(SEVERITY_ERROR, FACILITY_RPC,  0x000)
  432.  
  433. // call was rejected by callee, either by MF::HandleIncomingCall or
  434. #define RPC_E_CALL_REJECTED             (RPC_E_FIRST + 0x1)
  435.  
  436. // call was canceld by call - returned by MessagePending
  437. // this code only occurs if MessagePending return cancel
  438. #define RPC_E_CALL_CANCELED             (RPC_E_FIRST + 0x2)
  439.  
  440. // the caller is dispatching an intertask SendMessage call and
  441. // can NOT call out via PostMessage
  442. #define RPC_E_CANTPOST_INSENDCALL       (RPC_E_FIRST + 0x3)
  443.  
  444. // the caller is dispatching an asynchronus call can NOT
  445. // make an outgoing call on behalf of this call
  446. #define RPC_E_CANTCALLOUT_INASYNCCALL   (RPC_E_FIRST + 0x4)
  447.  
  448. // the caller is not in a state where an outgoing call can be made
  449. // this is the case if the caller has an outstandig call and
  450. // another incoming call was excepted by HIC; now the caller is
  451. // not allowed to call out again
  452. #define RPC_E_CANTCALLOUT_INEXTERNALCALL (RPC_E_FIRST + 0x5)
  453.  
  454. // the connection terminated or is in a bogus state
  455. // and can not be used any more. Other connections
  456. // are still valid.
  457. #define RPC_E_CONNECTION_TERMINATED     (RPC_E_FIRST + 0x6)
  458.  
  459. // the callee (server [not server application]) is not available
  460. // and disappeared; all connections are invalid
  461. #define RPC_E_SERVER_DIED               (RPC_E_FIRST + 0x7)
  462.  
  463. // the caller (client ) disappeared while the callee (server) was
  464. // processing a call
  465. #define RPC_E_CLIENT_DIED               (RPC_E_FIRST + 0x8)
  466.  
  467. // the date paket with the marshalled parameter data is
  468. // incorrect
  469. #define RPC_E_INVALID_DATAPACKET        (RPC_E_FIRST + 0x9)
  470.  
  471. // the call was not transmitted properly; the message queue
  472. // was full and was not emptied after yielding
  473. #define RPC_E_CANTTRANSMIT_CALL         (RPC_E_FIRST + 0xa)
  474.  
  475. // the client (caller) can not marshall the parameter data
  476. // or unmarshall the return data - low memory etc.
  477. #define RPC_E_CLIENT_CANTMARSHAL_DATA   (RPC_E_FIRST + 0xb)
  478. #define RPC_E_CLIENT_CANTUNMARSHAL_DATA (RPC_E_FIRST + 0xc)
  479.  
  480. // the server (caller) can not unmarshall the parameter data
  481. // or marshall the return data - low memory
  482. #define RPC_E_SERVER_CANTMARSHAL_DATA   (RPC_E_FIRST + 0xd)
  483. #define RPC_E_SERVER_CANTUNMARSHAL_DATA (RPC_E_FIRST + 0xe)
  484.  
  485. // received data are invalid; can be server or
  486. // client data
  487. #define RPC_E_INVALID_DATA              (RPC_E_FIRST + 0xf)
  488.  
  489. // a particular parameter is invalid and can not be un/marshalled
  490. #define RPC_E_INVALID_PARAMETER         (RPC_E_FIRST + 0x10)
  491.  
  492. // DDE conversation - no second outgoing call on same channel
  493. #define RPC_E_CANTCALLOUT_AGAIN                 (RPC_E_FIRST + 0x11)
  494.  
  495. // a internal error occured
  496. #define RPC_E_UNEXPECTED                (RPC_E_FIRST + 0xFFFF)
  497.  
  498.  
  499. /****** Globally Unique Ids *************************************************/
  500.  
  501. #ifdef __cplusplus
  502.  
  503. struct FAR GUID
  504. {
  505.     DWORD Data1;
  506.     WORD  Data2;
  507.     WORD  Data3;
  508.     BYTE  Data4[8];
  509.  
  510.     BOOL operator==(const GUID& iidOther) const
  511.  
  512. #ifdef WIN32
  513.     { return !memcmp(&Data1,&iidOther.Data1,sizeof(GUID)); }
  514. #else
  515.     { return !_fmemcmp(&Data1,&iidOther.Data1,sizeof(GUID)); }
  516. #endif
  517.     BOOL operator!=(const GUID& iidOther) const
  518.     { return !((*this) == iidOther); }
  519. };
  520.  
  521. #else
  522. typedef struct GUID
  523. {
  524.     DWORD Data1;
  525.     WORD  Data2;
  526.     WORD  Data3;
  527.     BYTE  Data4[8];
  528. } GUID;
  529. #endif
  530.  
  531. typedef                GUID FAR* LPGUID;
  532.  
  533.  
  534. // macros to define byte pattern for a GUID.
  535. //      Example: DEFINE_GUID(GUID_XXX, a, b, c, ...);
  536. //
  537. // Each dll/exe must initialize the GUIDs once.  This is done in one of
  538. // two ways.  If you are not using precompiled headers for the file(s) which
  539. // initializes the GUIDs, define INITGUID before including compobj.h.  This
  540. // is how OLE builds the initialized versions of the GUIDs which are included
  541. // in compobj.dll.
  542. //
  543. // The alternative (which some versions of the compiler don't handle properly;
  544. // they wind up with the initialized GUIDs in a data, not a text segment),
  545. // is to use a precompiled version of compobj.h and then include initguid.h
  546. // after compobj.h followed by one or more of the guid defintion files.
  547.  
  548.  
  549. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  550.     EXTERN_C const GUID CDECL FAR name
  551.  
  552. #ifdef INITGUID
  553. #include "initguid.h"
  554. #endif
  555.  
  556. #define DEFINE_OLEGUID(name, l, w1, w2) \
  557.     DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
  558.  
  559.  
  560. // Interface ID are just a kind of GUID
  561. typedef GUID IID;
  562. typedef                IID FAR* LPIID;
  563. #define IID_NULL            GUID_NULL
  564. #define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
  565.  
  566.  
  567. // Class ID are just a kind of GUID
  568. typedef GUID CLSID;
  569. typedef              CLSID FAR* LPCLSID;
  570. #define CLSID_NULL          GUID_NULL
  571. #define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
  572.  
  573.  
  574. #if defined(__cplusplus)
  575. #define REFGUID             const GUID FAR&
  576. #define REFIID              const IID FAR&
  577. #define REFCLSID            const CLSID FAR&
  578. #else
  579. #define REFGUID             const GUID FAR* const
  580. #define REFIID              const IID FAR* const
  581. #define REFCLSID            const CLSID FAR* const
  582. #endif
  583.  
  584.  
  585. #ifndef INITGUID
  586. #include "coguid.h"
  587. #endif
  588.  
  589. /****** Other value types ***************************************************/
  590.  
  591. // memory context values; passed to CoGetMalloc
  592. typedef enum tagMEMCTX
  593. {
  594.     MEMCTX_TASK = 1,            // task (private) memory
  595.     MEMCTX_SHARED = 2,          // shared memory (between processes)
  596. #ifdef _MAC
  597.     MEMCTX_MACSYSTEM = 3,       // on the mac, the system heap
  598. #endif
  599.  
  600.     // these are mostly for internal use...
  601.     MEMCTX_UNKNOWN = -1,        // unknown context (when asked about it)
  602.     MEMCTX_SAME = -2,           // same context (as some other pointer)
  603. } MEMCTX;
  604.  
  605.  
  606.  
  607. // class context: used to determine what scope and kind of class object to use
  608. // NOTE: this is a bitwise enum
  609. typedef enum tagCLSCTX
  610. {
  611.     CLSCTX_INPROC_SERVER = 1,   // server dll (runs in same process as caller)
  612.     CLSCTX_INPROC_HANDLER = 2,  // handler dll (runs in same process as caller)
  613.     CLSCTX_LOCAL_SERVER = 4     // server exe (runs on same machine; diff proc)
  614. } CLSCTX;
  615.  
  616. #define CLSCTX_ALL              (CLSCTX_INPROC_SERVER| \
  617.                  CLSCTX_INPROC_HANDLER| \
  618.                  CLSCTX_LOCAL_SERVER)
  619.  
  620. #define CLSCTX_INPROC           (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER)
  621.  
  622. #define CLSCTX_SERVER           (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER)
  623.  
  624.  
  625. // class registration flags; passed to CoRegisterClassObject
  626. typedef enum tagREGCLS
  627. {
  628.     REGCLS_SINGLEUSE = 0,       // class object only generates one instance
  629.     REGCLS_MULTIPLEUSE = 1,     // same class object genereates multiple inst.
  630.                                 // and local automatically goes into inproc tbl.
  631.     REGCLS_MULTI_SEPARATE = 2,  // multiple use, but separate control over each
  632.                                 // context.
  633.  
  634.     // NOTE: CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE is the same as
  635.     // (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER), REGCLS_MULTI_SEPARATE, but
  636.     // not the same as CLSCTX_LOCAL_SERVER, REGCLS_MULTI_SEPARATE.
  637. } REGCLS;
  638.  
  639.  
  640. // interface marshaling definitions
  641. #define MARSHALINTERFACE_MIN 40 // minimum number of bytes for interface marshl
  642.  
  643. // marshaling flags; passed to CoMarshalInterface
  644. typedef enum tagMSHLFLAGS
  645. {
  646.     MSHLFLAGS_NORMAL = 0,       // normal marshaling via proxy/stub
  647.     MSHLFLAGS_TABLESTRONG = 1,  // keep object alive; must explicitly release
  648.     MSHLFLAGS_TABLEWEAK = 2     // doesn't hold object alive; still must release
  649. } MSHLFLAGS;
  650.  
  651. // marshal context: determines the destination context of the marshal operation
  652. typedef enum tagMSHCTX
  653. {
  654.     MSHCTX_LOCAL = 0,           // unmarshal context is local (eg.shared memory)
  655.     MSHCTX_NOSHAREDMEM = 1,     // unmarshal context has no shared memory access
  656. } MSHCTX;
  657.  
  658.  
  659. // call type used by IMessageFilter::HandleIncommingMessage
  660. typedef enum tagCALLTYPE
  661. {
  662.     CALLTYPE_TOPLEVEL = 1,      // toplevel call - no outgoing call
  663.     CALLTYPE_NESTED   = 2,      // callback on behalf of previous outgoing call - should always handle
  664.     CALLTYPE_ASYNC    = 3,      // aysnchronous call - can NOT be rejected
  665.     CALLTYPE_TOPLEVEL_CALLPENDING = 4,  // new toplevel call with new LID
  666.     CALLTYPE_ASYNC_CALLPENDING    = 5   // async call - can NOT be rejected
  667. } CALLTYPE;
  668.  
  669. typedef struct tagINTERFACEINFO
  670. {
  671.     interface IUnknown FAR *pUnk;       // the pointer to the object
  672.     IID                         iid;            // interface id
  673.     WORD                        wMethod;        // interface methode
  674. } INTERFACEINFO, FAR * LPINTERFACEINFO;
  675.  
  676. // status of server call - returned by IMessageFilter::HandleIncommingCall
  677. // and passed to  IMessageFilter::RetryRejectedCall
  678. typedef enum tagSERVERCALL
  679. {
  680.     SERVERCALL_ISHANDLED    = 0,
  681.     SERVERCALL_REJECTED     = 1,
  682.     SERVERCALL_RETRYLATER   = 2
  683. } SERVERCALL;
  684.  
  685.  
  686. // Pending type indicates the level of nesting
  687. typedef enum tagPENDINGTYPE
  688. {
  689.     PENDINGTYPE_TOPLEVEL = 1,       // toplevel call
  690.     PENDINGTYPE_NESTED   = 2,       // nested call
  691. } PENDINGTYPE;
  692.  
  693. // return values of MessagePending
  694. typedef enum tagPENDINGMSG
  695. {
  696.     PENDINGMSG_CANCELCALL  = 0, // cancel the outgoing call
  697.     PENDINGMSG_WAITNOPROCESS  = 1, // wait for the return and don't dispatch the message
  698.     PENDINGMSG_WAITDEFPROCESS = 2  // wait and dispatch the message
  699.  
  700. } PENDINGMSG;
  701.  
  702.  
  703. // bit flags for IExternalConnection
  704. typedef enum tagEXTCONN
  705. {
  706.     EXTCONN_STRONG          = 0x0001        // strong connection
  707. } EXTCONN;
  708.  
  709.  
  710. /****** IUnknown Interface **************************************************/
  711.  
  712.  
  713. #undef  INTERFACE
  714. #define INTERFACE   IUnknown
  715.  
  716. DECLARE_INTERFACE(IUnknown)
  717. {
  718.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  719.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  720.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  721. };
  722.  
  723. typedef        IUnknown FAR* LPUNKNOWN;
  724.  
  725.  
  726. /****** Class Factory Interface *******************************************/
  727.  
  728.  
  729. #undef  INTERFACE
  730. #define INTERFACE   IClassFactory
  731.  
  732. DECLARE_INTERFACE_(IClassFactory, IUnknown)
  733. {
  734.     // *** IUnknown methods ***
  735.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  736.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  737.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  738.  
  739.     // *** IClassFactory methods ***
  740.     STDMETHOD(CreateInstance) (THIS_ LPUNKNOWN pUnkOuter,
  741.                   REFIID riid,
  742.                   LPVOID FAR* ppvObject) PURE;
  743.     STDMETHOD(LockServer) (THIS_ BOOL fLock) PURE;
  744.  
  745. };
  746. typedef       IClassFactory FAR* LPCLASSFACTORY;
  747.  
  748.  
  749. /****** Memory Allocation Interface ***************************************/
  750.  
  751.  
  752. #undef  INTERFACE
  753. #define INTERFACE   IMalloc
  754.  
  755. DECLARE_INTERFACE_(IMalloc, IUnknown)
  756. {
  757.     // *** IUnknown methods ***
  758.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  759.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  760.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  761.  
  762.     // *** IMalloc methods ***
  763.     STDMETHOD_(void FAR*, Alloc) (THIS_ ULONG cb) PURE;
  764.     STDMETHOD_(void FAR*, Realloc) (THIS_ void FAR* pv, ULONG cb) PURE;
  765.     STDMETHOD_(void, Free) (THIS_ void FAR* pv) PURE;
  766.     STDMETHOD_(ULONG, GetSize) (THIS_ void FAR* pv) PURE;
  767.     STDMETHOD_(int, DidAlloc) (THIS_ void FAR* pv) PURE;
  768.     STDMETHOD_(void, HeapMinimize) (THIS) PURE;
  769. };
  770. typedef       IMalloc FAR* LPMALLOC;
  771.  
  772.  
  773. /****** IMarshal Interface ************************************************/
  774.  
  775. // forward declaration for IStream; must include storage.h later to use
  776. #ifdef __cplusplus
  777. interface IStream;
  778. #else
  779. typedef interface IStream IStream;
  780. #endif
  781. typedef         IStream FAR* LPSTREAM;
  782.  
  783.  
  784. #undef  INTERFACE
  785. #define INTERFACE   IMarshal
  786.  
  787. DECLARE_INTERFACE_(IMarshal, IUnknown)
  788. {
  789.     // *** IUnknown methods ***
  790.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  791.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  792.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  793.  
  794.     // *** IMarshal methods ***
  795.     STDMETHOD(GetUnmarshalClass)(THIS_ REFIID riid, LPVOID pv,
  796.             DWORD dwDestContext, LPVOID pvDestContext,
  797.             DWORD mshlflags, LPCLSID pCid) PURE;
  798.     STDMETHOD(GetMarshalSizeMax)(THIS_ REFIID riid, LPVOID pv,
  799.             DWORD dwDestContext, LPVOID pvDestContext,
  800.             DWORD mshlflags, LPDWORD pSize) PURE;
  801.     STDMETHOD(MarshalInterface)(THIS_ LPSTREAM pStm, REFIID riid,
  802.             LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext,
  803.             DWORD mshlflags) PURE;
  804.     STDMETHOD(UnmarshalInterface)(THIS_ LPSTREAM pStm, REFIID riid,
  805.             LPVOID FAR* ppv) PURE;
  806.     STDMETHOD(ReleaseMarshalData)(THIS_ LPSTREAM pStm) PURE;
  807.     STDMETHOD(DisconnectObject)(THIS_ DWORD dwReserved) PURE;
  808. };
  809. typedef         IMarshal FAR* LPMARSHAL;
  810.  
  811.  
  812. #undef  INTERFACE
  813. #define INTERFACE   IStdMarshalInfo
  814.  
  815. DECLARE_INTERFACE_(IStdMarshalInfo, IUnknown)
  816. {
  817.     // *** IUnknown methods ***
  818.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  819.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  820.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  821.  
  822.     // *** IStdMarshalInfo methods ***
  823.     STDMETHOD(GetClassForHandler)(THIS_ DWORD dwDestContext,
  824.             LPVOID pvDestContext, LPCLSID pClsid) PURE;
  825. };
  826. typedef         IStdMarshalInfo FAR* LPSTDMARSHALINFO;
  827.  
  828.  
  829. /****** Message Filter Interface *******************************************/
  830.  
  831.  
  832. #undef  INTERFACE
  833. #define INTERFACE   IMessageFilter
  834.  
  835. DECLARE_INTERFACE_(IMessageFilter, IUnknown)
  836. {
  837.     // *** IUnknown methods ***
  838.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  839.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  840.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  841.  
  842.     // *** IMessageFilter methods ***
  843.     STDMETHOD_(DWORD, HandleInComingCall) (THIS_ DWORD dwCallType,
  844.                 HTASK htaskCaller, DWORD dwTickCount,
  845.                 DWORD dwReserved ) PURE;
  846.     STDMETHOD_(DWORD, RetryRejectedCall) (THIS_
  847.                 HTASK htaskCallee, DWORD dwTickCount,
  848.                 DWORD dwRejectType ) PURE;
  849.     STDMETHOD_(DWORD, MessagePending) (THIS_
  850.                 HTASK htaskCallee, DWORD dwTickCount,
  851.                 DWORD dwPendingType  ) PURE;
  852. };
  853. typedef       IMessageFilter FAR* LPMESSAGEFILTER;
  854.  
  855.  
  856. /****** External Connection Information ***********************************/
  857.  
  858. #undef  INTERFACE
  859. #define INTERFACE   IExternalConnection
  860.  
  861. DECLARE_INTERFACE_(IExternalConnection, IUnknown)
  862. {
  863.     // *** IUnknown methods ***
  864.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  865.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  866.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  867.  
  868.     // *** IExternalConnection methods ***
  869.     STDMETHOD_(DWORD, AddConnection) (THIS_ DWORD extconn, DWORD reserved) PURE;
  870.     STDMETHOD_(DWORD, ReleaseConnection) (THIS_ DWORD extconn, DWORD reserved, BOOL fLastReleaseCloses) PURE;
  871. };
  872. typedef       IExternalConnection FAR* LPEXTERNALCONNECTION;
  873.  
  874.  
  875. /****** Enumerator Interfaces *********************************************/
  876.  
  877. /*
  878.  *  Since we don't use parametrized types, we put in explicit declarations
  879.  *  of the enumerators we need.
  880.  */
  881.  
  882.  
  883. #undef  INTERFACE
  884. #define INTERFACE   IEnumString
  885.  
  886. DECLARE_INTERFACE_(IEnumString, IUnknown)
  887. {
  888.     // *** IUnknown methods ***
  889.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  890.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  891.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  892.  
  893.     // *** IEnumString methods ***
  894.     STDMETHOD(Next) (THIS_ ULONG celt,
  895.                LPSTR FAR* rgelt,
  896.                ULONG FAR* pceltFetched) PURE;
  897.     STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
  898.     STDMETHOD(Reset) (THIS) PURE;
  899.     STDMETHOD(Clone) (THIS_ IEnumString FAR* FAR* ppenm) PURE;
  900. };
  901. typedef      IEnumString FAR* LPENUMSTRING;
  902.  
  903.  
  904. #undef  INTERFACE
  905. #define INTERFACE   IEnumUnknown
  906.  
  907. DECLARE_INTERFACE_(IEnumUnknown, IUnknown)
  908. {
  909.     // *** IUnknown methods ***
  910.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  911.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  912.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  913.  
  914.     // *** IEnumUnknown methods ***
  915.     STDMETHOD(Next) (THIS_ ULONG celt, LPUNKNOWN FAR* rgelt, ULONG FAR* pceltFetched) PURE;
  916.     STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
  917.     STDMETHOD(Reset) (THIS) PURE;
  918.     STDMETHOD(Clone) (THIS_ IEnumUnknown FAR* FAR* ppenm) PURE;
  919. };
  920. typedef         IEnumUnknown FAR* LPENUMUNKNOWN;
  921.  
  922.  
  923. /****** STD Object API Prototypes *****************************************/
  924.  
  925. STDAPI_(DWORD) CoBuildVersion( VOID );
  926.  
  927. /* init/uninit */
  928.  
  929. STDAPI  CoInitialize(LPMALLOC pMalloc);
  930. STDAPI_(void)  CoUninitialize(void);
  931. STDAPI  CoGetMalloc(DWORD dwMemContext, LPMALLOC FAR* ppMalloc);
  932. STDAPI_(DWORD) CoGetCurrentProcess(void);
  933. STDAPI  CoCreateStandardMalloc(DWORD memctx, IMalloc FAR* FAR* ppMalloc);
  934.  
  935.  
  936. /* register/revoke/get class objects */
  937.  
  938. STDAPI  CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, LPVOID pvReserved,
  939.             REFIID riid, LPVOID FAR* ppv);
  940. STDAPI  CoRegisterClassObject(REFCLSID rclsid, LPUNKNOWN pUnk,
  941.             DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister);
  942. STDAPI  CoRevokeClassObject(DWORD dwRegister);
  943.  
  944.  
  945. /* marshaling interface pointers */
  946.  
  947. STDAPI CoMarshalInterface(LPSTREAM pStm, REFIID riid, LPUNKNOWN pUnk,
  948.             DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags);
  949. STDAPI CoUnmarshalInterface(LPSTREAM pStm, REFIID riid, LPVOID FAR* ppv);
  950. STDAPI CoMarshalHresult(LPSTREAM pstm, HRESULT hresult);
  951. STDAPI CoUnmarshalHresult(LPSTREAM pstm, HRESULT FAR * phresult);
  952. STDAPI CoReleaseMarshalData(LPSTREAM pStm);
  953. STDAPI CoDisconnectObject(LPUNKNOWN pUnk, DWORD dwReserved);
  954. STDAPI CoLockObjectExternal(LPUNKNOWN pUnk, BOOL fLock, BOOL fLastUnlockReleases);
  955. STDAPI CoGetStandardMarshal(REFIID riid, LPUNKNOWN pUnk,
  956.             DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags,
  957.             LPMARSHAL FAR* ppMarshal);
  958.  
  959. STDAPI_(BOOL) CoIsHandlerConnected(LPUNKNOWN pUnk);
  960.  
  961. /* dll loading helpers; keeps track of ref counts and unloads all on exit */
  962.  
  963. STDAPI_(HINSTANCE) CoLoadLibrary(LPSTR lpszLibName, BOOL bAutoFree);
  964. STDAPI_(void) CoFreeLibrary(HINSTANCE hInst);
  965. STDAPI_(void) CoFreeAllLibraries(void);
  966. STDAPI_(void) CoFreeUnusedLibraries(void);
  967.  
  968.  
  969. /* helper for creating instances */
  970.  
  971. STDAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
  972.             DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv);
  973.  
  974.  
  975. /* other helpers */
  976. STDAPI_(BOOL) IsEqualGUID(REFGUID rguid1, REFGUID rguid2);
  977. STDAPI StringFromCLSID(REFCLSID rclsid, LPSTR FAR* lplpsz);
  978. STDAPI CLSIDFromString(LPSTR lpsz, LPCLSID pclsid);
  979. STDAPI StringFromIID(REFIID rclsid, LPSTR FAR* lplpsz);
  980. STDAPI IIDFromString(LPSTR lpsz, LPIID lpiid);
  981. STDAPI_(BOOL) CoIsOle1Class(REFCLSID rclsid);
  982. STDAPI ProgIDFromCLSID (REFCLSID clsid, LPSTR FAR* lplpszProgID);
  983. STDAPI CLSIDFromProgID (LPCSTR lpszProgID, LPCLSID lpclsid);
  984. STDAPI_(int) StringFromGUID2(REFGUID rguid, LPSTR lpsz, int cbMax);
  985.  
  986. STDAPI CoCreateGuid(GUID FAR *pguid);
  987.  
  988. STDAPI_(BOOL) CoFileTimeToDosDateTime(
  989.          FILETIME FAR* lpFileTime, LPWORD lpDosDate, LPWORD lpDosTime);
  990. STDAPI_(BOOL) CoDosDateTimeToFileTime(
  991.                WORD nDosDate, WORD nDosTime, FILETIME FAR* lpFileTime);
  992. STDAPI  CoFileTimeNow( FILETIME FAR* lpFileTime );
  993.  
  994.  
  995. STDAPI CoRegisterMessageFilter( LPMESSAGEFILTER lpMessageFilter,
  996.                 LPMESSAGEFILTER FAR* lplpMessageFilter );
  997.  
  998.  
  999. /* TreatAs APIS */
  1000.  
  1001. STDAPI CoGetTreatAsClass(REFCLSID clsidOld, LPCLSID pClsidNew);
  1002. STDAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew);
  1003.  
  1004.  
  1005. /* the server dlls must define their DllGetClassObject and DllCanUnloadNow
  1006.  * to match these; the typedefs are located here to ensure all are changed at
  1007.  * the same time.
  1008.  */
  1009.  
  1010. STDAPI  DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv);
  1011. #ifdef _MAC
  1012. typedef STDAPICALLTYPE HRESULT (FAR* LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID FAR*);
  1013. #else
  1014. typedef HRESULT (STDAPICALLTYPE FAR* LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID FAR*);
  1015. #endif
  1016.  
  1017.  
  1018. STDAPI  DllCanUnloadNow(void);
  1019. #ifdef _MAC
  1020. typedef STDAPICALLTYPE HRESULT (FAR* LPFNCANUNLOADNOW)(void);
  1021. #else
  1022. typedef HRESULT (STDAPICALLTYPE FAR* LPFNCANUNLOADNOW)(void);
  1023. #endif
  1024.  
  1025.  
  1026. /****** Debugging Helpers *************************************************/
  1027.  
  1028. #ifdef _DEBUG
  1029. // writes to the debug port and displays a message box
  1030. STDAPI FnAssert(LPSTR lpstrExpr, LPSTR lpstrMsg, LPSTR lpstrFileName, UINT iLine);
  1031. #endif  //  _DEBUG
  1032.  
  1033. #endif // _COMPOBJ_H_
  1034.